package com.atde._03_creational_design_patterns.singleton.type06;


/**
 * @BelongsProject: hsp_java_design_mode
 * @BelongsPackage: com.atde._03_creational_design_patterns.singleton.type06
 * @Author: Del
 * @CreateTime: 2025-05-31  16:30
 * @Description: 单例模式-懒汉式（双重检查）
 * @Version: 1.0
 */
public class SingletonTest06 {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance1 = Singleton.getInstance();
        System.out.println(instance == instance1);
        System.out.println(instance.hashCode());
        System.out.println(instance1.hashCode());
    }
}


/**
 * 懒汉式（线程安全、双重检查）
 * 1）Double-Check 概念是多线程开发中常使用的，如代码中所示，我们进行了两次
 * if  (instance == null) {}检查，这样就可以保证线程安全了
 * 2）这样，实例化代码只用执行一次，后面再次访问时，判断 if  (instance == null)
 * 直接 return  instance，从而实例化一次，也就避免了反复进行方法同步
 * 3）线程安全： 延迟加载；效率较高
 * 4）结论：在实际开发中，推荐使用这种单例设计模式
 */
class Singleton {
    // 实例使用 volatile 关键字修饰，保证多线程下的可见性
    private static volatile Singleton instance;


    // 提供一个静态的公有方法，加入双重检查代码，解决线程安全问题，同时解决懒加载问题
    // 同时避免了同步代码块的锁开销
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
